package middleware.p2p;

import org.apache.log4j.Logger;

/**
 *	Classe che implementa un attività nel contesto del Sistema.
 *	Una activity contiene un WorkFlow, una WorkerNetwork nella quale trovare i Worker per far eseguire i Task 
 *	e un Proxy per eseguire l'enqueue dei TaskDescriptor nella coda remota.
 *	@see 	Workflow
 *	@see	WorkerNetwork
 *	@see	TQueueManagerProxy
 *	@see	TQueueManager 
 */
public class Activity {
	/**
	 * 	Workflow contenente i task da eseguire.
	 */
    private Workflow wf;
    /**
     * 	WorkerNetwork contenente i Worker che dovranno eseguire i Task del Workflow
     */
    private WorkerNetwork sbn;
    /**
     * 	Proxy necessario a fare l'enqueue nella coda remota.
     */
    private TQueueManagerProxy wkProxy;
    /**
     * 	Costruttore di default della classe.
     * 	Il costruttore imposta tutti gli oggetti interni a null.
     */
    public Activity(){
        wf=null;
        sbn=null;
        wkProxy=null;
    }    
    /**
     * 	Metodo per ottenere il Workflow associato all'Activity
     * 	@return	Il Workflow contenuto nell'Activity
     */
    public Workflow getWf() {
        return wf;
    }
    /**
     * 	Metodo per impostare il Workflow da associare all'Activity
     * 	@param 	wf	Workflow da associare all'Activity
     */
    public void setWf(Workflow wf) {
        this.wf = wf;
    }
    /**
     * 	Metodo per ottere la WorkerNetwork associata all'Activity
     * 	@return	La WorkerNetwork contenuta nell'Activity
     */
    public WorkerNetwork getSbn() {
        return sbn;
    }
    /**
     * 	Metodo per impostare la WorkerNetwork contenente i Worker che dovranno eseguire i Task
     * 	@param	sbn	WorkerNetwork da impostare.
     */
    public void setSbn(WorkerNetwork sbn) {
        this.sbn = sbn;
    }
    /**
     * 	Metodo per ottenere il proxy utilizzato per fare l'enqueue nella coda remota. 
     * 	@return	Il Proxy associato al TQueueManager contenuto nell'Activity
     */
    public TQueueManagerProxy getWkProxy() {
        return wkProxy;
    }
    /**
     * 	Metodo per impostare il proxy utilizzato per fare l'enqueue nella coda remota.
     * 	@param 	wkProxy	Il Proxy da impostare.
     */
    public void setWkProxy(TQueueManagerProxy wkProxy) {
        this.wkProxy = wkProxy;
    }
    /**
     * 	Metodo che si occupa di schedurare i task appartenenti al Workflow dell'Activity.
     * 	Il metodo genera un Proxy ed esegue, tramite il Proxy, l'enqueue del TaskDescriptor nella coda remota. 
     */
    public void sheduleActivity(){
    	Logger log=Logger.getLogger(this.getClass());
    	log.info("Scheduling Activity containing Workflow "+this.getWf().getID());
        TQProxyFactory factory = new TQProxyFactory();
        wkProxy = factory.getProxy();       
        TaskDescriptor tasks[] = this.getWf().getTasks();
        Address workers[] = this.getSbn().getWorkers();
        int lenght= (tasks.length>workers.length)?workers.length:tasks.length;
        for (int i=0;i<lenght;i++) {        	
        	wkProxy.setAddr(workers[i]);
        	log.debug("Setting address "+workers[i].getIP()+":"+workers[i].getPort()+" to the Proxy");        	
        	wkProxy.enqueue(tasks[i]);
        	log.debug("Task "+tasks[i].getID()+" ("+tasks[i].getCommand()+") enqueue in the remote queue.");
        }       
    }
}
